/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pfc.arbol;

import java.io.File;
import java.util.ArrayList;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import pfc.comun.IDEpfc;
import pfc.comun.Proyecto;
import pfc.generacion.Application;
import pfc.interfaces.Salvable;

/**
 *
 * @author xandru
 */
public class ArbolFicheros extends DefaultTreeModel implements Salvable
{
    ArrayList<Monitor> monitores = new ArrayList<Monitor>();

    public static TreeModel load(String workdir) {
        String path = workdir;

        File dir = new File(path);

        ArbolFicheros a = new ArbolFicheros(new DefaultMutableTreeNode("/"));
        File[] proyectos = dir.listFiles();

        for (int i=0; i<proyectos.length; i++)
        {
            String nombredir = proyectos[i].getAbsolutePath();
            String nombreproyecto = proyectos[i].getName();

            System.out.println("Creando arbol de ficheros del proyecto " + nombreproyecto);
            Proyecto p = new Proyecto(nombreproyecto,nombredir);
            a.addProyecto( p );
        }

        return a;
    }

    public ArbolFicheros(TreeNode raiz) {
        super(raiz);

    }

    public void save() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void addProyecto(Proyecto p) {
        
        DefaultMutableTreeNode raiz = (DefaultMutableTreeNode) this.getRoot();

        File f = new File(p.path);
        FileTreeNode ftn = new FileTreeNode(f);
        raiz.add(ftn);


        File fApps = new File(f.getAbsolutePath() + File.separator +  "apps");
        //Si no existe la carpeta apps dentro del proyecto, no sigo, hago return
        if (!fApps.exists()||!fApps.isDirectory())
            return;

        //Si estoy aqui es que existe la carpeta apps en el proyecto
        for (File app: fApps.listFiles())
        {
            //Un file por aplicacion

            //Si no es un directorio continuo con el bucle para comprobar el siguiente
            if (!app.isDirectory())
                continue;

            //si estoy aqui es que existe un directorio para esa aplicacion
            FileTreeNode nApp = new FileTreeNode(app);
            ftn.add(nApp);
            crearMonitorDirectorio(nApp, app.getAbsolutePath());

            File src = new File(app.getAbsolutePath() + File.separator + "src");
            if (!src.exists()||!src.isDirectory())
                continue;
            FileTreeNode nSrc = new FileTreeNode(src);
            nApp.add(nSrc);
            crearMonitorDirectorio(nSrc, src.getAbsolutePath());
            for (File srcVarios: src.listFiles())
            {
                if (!srcVarios.exists()||!srcVarios.isDirectory())
                    continue;

                FileTreeNode nTmp = new FileTreeNode(srcVarios);
                nSrc.add(nTmp);
                crearMonitorDirectorio(nTmp, srcVarios.getAbsolutePath());
                nTmp.setSourceParent(true);
   //     System.out.println("ArbolFicheros " + nTmp.toString() +"->" + nTmp._isSourceParent);
                for (File fJava: srcVarios.listFiles())
                {
                    FileTreeNode nJava = new FileTreeNode(fJava);                    
                    nTmp.add(nJava);
                    crearMonitorFichero(nJava,fJava.getAbsolutePath());
                }
            }


            File web = new File(app.getAbsolutePath() + File.separator + "web");
            if (!web.exists()||!web.isDirectory())
                continue;
            FileTreeNode nWeb = new FileTreeNode(web);
            nApp.add(nWeb);

            File jsp = new File(web + File.separator + "jsp");
            if (!jsp.exists()||!jsp.isDirectory())
                continue;
            FileTreeNode nJsp = new FileTreeNode(jsp);
            nWeb.add(nJsp);
            nJsp.setSourceParent(true);
            for(File fJsp: jsp.listFiles())
            {
                FileTreeNode tmp = new FileTreeNode(fJsp);
                nJsp.add(tmp);
            }

            File context = new File(web.getAbsolutePath() + File.separator + "META-INF" + File.separator + "context.xml");
            File webdesc = new File(web.getAbsolutePath() + File.separator + "WEB-INF" + File.separator + "web.xml");

            if (context.exists())
                nWeb.add(new FileTreeNode(context));

            if (webdesc.exists())
                nWeb.add(new FileTreeNode(webdesc));
        }       
    }


    private void crearMonitorDirectorio(FileTreeNode nApp, String path) {
        /*
        Monitor mon = new Monitor(nApp, path);
        monitores.add(mon);
        mon.addDirectoryListener(nApp);*/

    }

    private void crearMonitorFichero(FileTreeNode nJava, String absolutePath) {
        /*
        Monitor mon = new Monitor(nJava, absolutePath);
        monitores.add(mon);
        mon.addFileListener(nJava);
         *
         */
    }

    public void addApplicacion(Application ap, Proyecto proyecto) {

        FileTreeNode p = getProyectoFileNode(proyecto);
        FileTreeNode appNode = new FileTreeNode(ap.getPath());
        p.add(appNode);
        Monitor mon = new Monitor(appNode, ap.getPath().getAbsolutePath());
        monitores.add(mon);
        mon.addDirectoryListener(appNode);
    }




    public FileTreeNode getProyectoFileNode(Proyecto proyecto) {
        DefaultMutableTreeNode raiz = (DefaultMutableTreeNode) getRoot();
        FileTreeNode ftn = null;

        for (int i=0; i<raiz.getChildCount();i++)
        {
            ftn = (FileTreeNode) raiz.getChildAt(i);
            File f = ftn.getFile();
            if (f.getAbsolutePath().equals(proyecto.path))
                return ftn;

        }

        return ftn;
    }

}
